home *** CD-ROM | disk | FTP | other *** search
- #include "AppleShareRegistry.h"
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <stddef.h> /* needed for offsetof */
- #include <string.h>
-
- #include <Memory.h>
- #include <TextUtils.h>
-
- OAMNotificationUPP gNotifyProc = NULL;
-
-
- void BuildObjectSpecByNameType(OAMObjectSpec *obj, StringPtr name, OAMType type);
- void BuildObjectSpecByShortID(OAMObjectSpec *obj, OAMShortObjectSpec id);
- void MyListRegistryAgents(unsigned char * name, unsigned char * zone);
- OAMSessionID MyOpenLocalAgentSession();
- OAMStatus MyAuthenticate(OAMSessionID sess, StringPtr name, StringPtr password);
- OAMStatus MyGetMachineName(OAMSessionID sess, StringPtr machineName);
- void MyListAllUserNames(OAMSessionID sess);
- void MyCreateUser(OAMSessionID sess, unsigned char * name);
- void MyAuthenticateUser(OAMSessionID sessionID, unsigned char* userName);
- void MyChangeUserName(OAMSessionID sess, OAMObjectSpec *userObj, unsigned char *name);
- void MySetNotifyProc(OAMSessionID sessionID);
- void MyNotifyProc( OAMNotification *no );
-
- void DisplayAttr(OAMAttributeDescriptor *attr);
- void ConcatUniqueNumString( unsigned char *name);
-
- void BuildObjectSpecByNameType(OAMObjectSpec *obj, StringPtr name, OAMType type)
- {
- short len = 0;
-
- memset(obj, 0, sizeof(OAMObjectSpec));
- obj->specType = kOAMObjectSpecByNameType;
- obj->objectType = type;
- len = *name + 1;
- memcpy(obj->u.name, name, len);
- }
-
- void BuildObjectSpecByShortID(OAMObjectSpec *obj, OAMShortObjectSpec id)
- {
- memset(obj, 0, sizeof(OAMObjectSpec));
- obj->specType = kOAMObjectSpecByShortID;
- obj->u.shortID = id;
- }
-
-
- void MyListRegistryAgents(unsigned char * name, unsigned char * zone)
- {
- UInt32 numInBuffer = 0;
- UInt32 numFound = 0;
- OAMStatus err = noErr;
- char buffer[2048];
- OAMBufferDescriptor lookup_bd;
-
-
- OAMServerLocator* loc = NULL;
- int loc_size = offsetof(OAMServerLocator,protSpecific) + sizeof(Str32);
-
- OAMServerSpec serverSpec;
-
- int serverIndex;
-
- /* set up buffer descriptor */
- lookup_bd.buffer = buffer;
- lookup_bd.bufferLen = sizeof(buffer);
- lookup_bd.actCount = 0;
-
- /* Build AppleTalk OAMServerLocator */
- loc = (OAMServerLocator *) NewPtr(loc_size);
- memset(loc, 0, loc_size);
- loc->specSize = loc_size;
- loc->protType = kOAMLocatorAppletalk;
- memcpy (loc->name, name, sizeof(Str32));
- memcpy (loc->protSpecific, zone, sizeof(Str32));
-
- err = OAMFindServer(loc, &lookup_bd, &numInBuffer, &numFound, NULL);
- printf("Found %d AppleShare Registry Agent(s).\n", numFound);
-
- for (serverIndex = 1; serverIndex<=numInBuffer; serverIndex++)
- {
- err = OAMFindServerExtract(&lookup_bd, serverIndex,&serverSpec);
- p2cstr(serverSpec.name);
- printf("%s\n", serverSpec.name);
- }
- }
- OAMSessionID MyOpenLocalAgentSession()
- {
- OAMStatus err = noErr;
- OAMSessionID sessID = 0;
-
- err = OAMOpenSession(NULL, &sessID, NULL);
-
- return sessID;
- }
-
- OAMStatus MyAuthenticate(OAMSessionID sess, StringPtr name, StringPtr password)
- {
- OAMStatus err = noErr;
- OAMObjectSpec obj;
- OAMKey key;
-
- memset(&key, 0, sizeof(key));
- memcpy(&key.keyBuffer, password, 8);
- key.keyBufferLen = 8;
- BuildObjectSpecByNameType(&obj, name, kOAMUser);
- err = OAMAuthenticateSession(sess, &obj, &key, NULL);
-
- return err;
- }
-
- OAMStatus MyGetMachineName(OAMSessionID sess, StringPtr machineName)
- {
- OAMStatus err = noErr;
- OAMObjectSpec machineObj;
- OAMAttributeDescriptor myAttrDesc[2] = {};
-
- memset(&myAttrDesc, 0, sizeof(myAttrDesc));
-
- myAttrDesc[0].attributeSignature = kOAMMachine;
- myAttrDesc[0].attributeType = kOAMServerName;
- myAttrDesc[0].bufferDescriptor.buffer = machineName;
- myAttrDesc[0].bufferDescriptor.bufferLen = sizeof(Str31);
- myAttrDesc[0].bufferDescriptor.actCount = sizeof(Str31);
- /* null terminate array of attribute descriptors */
- myAttrDesc[1].attributeSignature = NULL;
-
- BuildObjectSpecByShortID(&machineObj, kOAMMachineShortID);
- err = OAMGetAttribute(sess, &machineObj, myAttrDesc, NULL);
-
- return err;
- }
- void DisplayAttr(OAMAttributeDescriptor *attr)
- {
- if (attr && attr->attributeSignature) {
- printf("---------------------------------\n");
- printf("attr->status = %d\n",attr->status );
- printf("attr->offset = %d\n",attr->offset );
- printf("attr->actSize = %d\n",attr->actSize );
- printf("attr->bufferDescriptor.bufferLen = %d\n",attr->bufferDescriptor.bufferLen );
- printf("attr->bufferDescriptor.actCount = %d\n",attr->bufferDescriptor.actCount );
- if (attr->status == 0)
- {
- switch (attr->attributeSignature) {
- case kOAMBasic:
- switch (attr->attributeType) {
- case kOAMName:
- {
- StringPtr name = (StringPtr)attr->bufferDescriptor.buffer;
- p2cstr(name);
- printf("Name = %s",name);
- }
- break;
- case kOAMInternetName:
- {
- StringPtr name = (StringPtr)attr->bufferDescriptor.buffer;
- p2cstr(name);
- printf("Name = %s",name);
- }
- break;
- case kOAMShortID:
- printf("ID = %d",*((UInt32*)attr->bufferDescriptor.buffer));
- break;
- case kOAMType:
- printf("Type = %.4s",(char*)attr->bufferDescriptor.buffer);
- break;
- };
- break;
- case kOAMUser:
- switch (attr->attributeType) {
- case kOAMUserFlags:
- printf("userFlags = 0x%x",*((UInt16*)attr->bufferDescriptor.buffer));
- break;
- case kOAMUserComment:
- {
- printf("comment = %#s",(StringPtr)attr->bufferDescriptor.buffer);
- }
- break;
- case kOAMPasswordLen:
- printf("pwdLen = %d",*((UInt8*)attr->bufferDescriptor.buffer));
- break;
- case kOAMLastLogin:
- {
- DateTimeRec date = {};
- SecondsToDate(*(UInt32*)attr->bufferDescriptor.buffer, &date);
- printf("kLastLogin: %d/%d/%d", date.month, date.day, date.year);
- }
- break;
- };
-
- break;
-
- case kOAMService:
- switch (attr->attributeType) {
- case kOAMShortStatus:
- printf("shortStatus = 0x%x",*((UInt32*)attr->bufferDescriptor.buffer));
- break;
- /*
- case kOAMDetailedStatus:
- printf("detailedStatus = 0x%x",*((UInt32*)attr->bufferDescriptor.buffer));
- break;
- */
- case kOAMServiceFlags:
- printf("kServiceFlags = 0x%x",*((UInt32*)attr->bufferDescriptor.buffer));
- break;
- };
- break;
-
- case kOAMMachine:
- switch (attr->attributeType) {
- case kOAMGuestProgramLinking:
- printf("kGuestProgramLinking = 0x%x",*((UInt8*)attr->bufferDescriptor.buffer));
- break;
- case kOAMNoGuestAccess:
- printf("kNoGuestAccess = 0x%x",*((UInt8*)attr->bufferDescriptor.buffer));
- break;
- case kOAMProgramLinking:
- printf("kProgramLinking = 0x%x",*((UInt8*)attr->bufferDescriptor.buffer));
- break;
- case kOAMServerName:
- printf("name = %#s",(StringPtr)attr->bufferDescriptor.buffer);
- break;
- case kOAMMultihoming:
- printf("kMultihoming = 0x%x",*((UInt8*)attr->bufferDescriptor.buffer));
- break;
- case kOAMNoSavePassword:
- printf("kNoSavePassword = 0x%x",*((UInt8*)attr->bufferDescriptor.buffer));
- break;
- case kOAMMinPasswordLen:
- printf("kMinPasswordLen = 0x%x",*((UInt8*)attr->bufferDescriptor.buffer));
- break;
- case kOAMMaxBadLogins:
- printf("kMaxBadLogins = %d",*((UInt16*)attr->bufferDescriptor.buffer));
- break;
- case kOAMDefaultShutdown:
- printf("kDefaultShutdown = %d",*((UInt16*)attr->bufferDescriptor.buffer));
- break;
- case kOAMUniqueID:
- printf("kUniqueID = %d",*((UInt32*)attr->bufferDescriptor.buffer));
- break;
- };
- break;
-
- case kOAMGestalt:
- printf("selector: %.4s response: %X", (char*)&attr->attributeType, *((SInt32*)attr->bufferDescriptor.buffer));
- break;
-
-
- }
- printf(" <status, len> = <%d, %d> ",attr->status,attr->bufferDescriptor.actCount );
- printf("\n---------------------------------\n");
-
- }
-
- }
- }
- void MyListAllUserNames(OAMSessionID sess)
- {
- OAMStatus err = noErr;
- OAMIterationSpec iter;
- UInt32 maxToGet = 15;
- OAMType typeList[2] = {kOAMUser,0};
- char bd_buffer[4096] = {};
- char iter_buffer[512] = {};
- OAMBufferDescriptor bd = {};
- OAMAttributeDescriptor iter_attr[2] = {};
- Str31 userName = {};
- int userCount = 0;
-
- /* set up buffer descriptor */
- bd.buffer = bd_buffer;
- bd.bufferLen = sizeof(bd_buffer);
- bd.actCount = 0;
-
- /* set up iter spec */
- memset(&iter, 0 , sizeof(iter));
- iter.iterationType = kOAMIterObjects;
- iter.typeList = typeList;
- iter.iterationFlags = kOAMIterByIndex;
- iter.u.startingIndex = 1;
- iter.maxToGet = maxToGet;
-
- /* set up iter_attr */
- iter_attr[0].attributeSignature = kOAMBasic;
- iter_attr[0].attributeType = kOAMName;
- iter_attr[0].bufferDescriptor.buffer = userName;
- iter_attr[0].bufferDescriptor.bufferLen = sizeof(iter_buffer);
- iter_attr[0].bufferDescriptor.actCount = 0;
- /* null terminate array of attribute descriptors */
- iter_attr[1].attributeSignature = NULL;
-
- do
- {
- err = OAMIterate(sess, &iter, iter_attr, &bd, NULL);
-
- if(!err) {
- OAMObjectSpec obj = {};
- OAMParseInfo parseInfo;
- int attrIndex;
-
- memset(&parseInfo, 0, sizeof(OAMParseInfo));
- err = OAMParseAttributeBuffer(&bd, iter_attr, &parseInfo);
-
-
- while(OAMParseGetNextObject(&parseInfo, &obj) != kOAMParseDone) {
- printf("id = %d type = %s\n", obj.u.shortID, (char*)&obj.objectType);
- for ( attrIndex = 0; ; attrIndex++)
- {
- if (OAMParseGetNextAttribute(&parseInfo, &iter_attr[attrIndex]) != kOAMParseDone)
- DisplayAttr(&iter_attr[attrIndex]);
- else
- break;
- }
- userCount++;
- }
- iter.u.startingIndex += maxToGet;
- }
- } while (!err && iter.more );
- printf("userCount(%d)\n",userCount);
- }
-
- void MyCreateUser(OAMSessionID sessionID, unsigned char *name)
- {
- OAMStatus err = noErr;
- OAMObjectSpec userObj;
- OAMAttributeDescriptor myAttrDesc[3] = {};
- #if 0 // This line generates a compiler error in CW Pro 5
- char password[8] = "temp\0\0\0\0"; /* Zero Padded 8 byte key */
- #else
- char password[8] = { 't', 'e', 'm', 'p', 0, 0, 0, 0 };
- #endif
- UInt16 userFlags = kOAMLoginEnabledMask | kOAMGetNewPwdMask;
-
- printf("userFlags(0x%X)\n",userFlags);
- memset(&myAttrDesc, 0, sizeof(myAttrDesc));
- /* password attribute */
- myAttrDesc[0].attributeSignature = kOAMUser;
- myAttrDesc[0].attributeType = kOAMPasswordAttribute;
- myAttrDesc[0].bufferDescriptor.buffer = password;
- myAttrDesc[0].bufferDescriptor.bufferLen = 8;
- myAttrDesc[0].bufferDescriptor.actCount = 0;
- /* user flags attribute */
- myAttrDesc[1].attributeSignature = kOAMUser;
- myAttrDesc[1].attributeType = kOAMUserFlags;
- myAttrDesc[1].bufferDescriptor.buffer = &userFlags;
- myAttrDesc[1].bufferDescriptor.bufferLen = sizeof(userFlags);
- myAttrDesc[1].bufferDescriptor.actCount = 0;
- /* null terminate array of attribute descriptors */
- myAttrDesc[2].attributeSignature = NULL;
-
- printf("CreateUser(%#s)\n", name);
- BuildObjectSpecByNameType(&userObj,(StringPtr) name, kOAMUser);
- err = OAMCreateObject(sessionID, &userObj, NULL, NULL);
-
- }
-
- void MyAuthenticateUser(OAMSessionID sessionID, unsigned char* userName)
- {
- OAMStatus err = noErr;
- OAMAuthenticateInfo auth = {};
- OAMObjectSpec userObj = {};
- OAMBufferDescriptor input = {};
- OAMBufferDescriptor output = {};
- char output_buffer[16] = {};
- #if 0 // This line generates a compiler error in CW Pro 5
- char password[8] = "temp\0\0\0\0"; /* Zero Padded 8 byte key */
- #else
- char password[8] = { 't', 'e', 'm', 'p', 0, 0, 0, 0 };
- #endif
-
- /* set up user object */
- BuildObjectSpecByNameType(&userObj,(StringPtr) userName, kOAMUser);
-
- /* set up authInfo */
- auth.objectSpec = &userObj;
- auth.flags = 0;
- auth.stage = kOAMAuthLogin;
- memcpy(auth.uam,"Cleartxt Passwrd",sizeof("Cleartxt Passwrd"));
-
- /* set up input buffer */
- input.buffer = &password;
- input.bufferLen = 8;
- input.actCount = 8;
-
- /* set up output buffer */
- output.buffer = &output_buffer;
- output.bufferLen = 16;
-
- err = OAMAuthenticateObject(sessionID, &auth, &input, &output, NULL);
-
- printf("OAMAuthenticateObject err:%d\n", err);
- printf("authInfo->objStatus(%d)\n", auth.objStatus);
-
- }
-
- void ConcatUniqueNumString( unsigned char *name)
- {
- unsigned long secs;
- Str255 datestr;
-
- GetDateTime(&secs);
- NumToString(secs, datestr);
- p2cstr(datestr);
- p2cstr((unsigned char *)name);
-
- strcat((char*) name, (const char *)datestr); /* userXXXXX */
-
- c2pstr((char*)name);
-
- }
- void MyChangeUserName(OAMSessionID sess, OAMObjectSpec *userObj, unsigned char *name)
- {
- OAMStatus err = noErr;
- OAMAttributeDescriptor myAttrDesc[2] = {};
-
- memset(&myAttrDesc, 0, sizeof(myAttrDesc));
-
- myAttrDesc[0].attributeSignature = kOAMBasic;
- myAttrDesc[0].attributeType = kOAMName;
- myAttrDesc[0].bufferDescriptor.buffer = name;
- myAttrDesc[0].bufferDescriptor.bufferLen = sizeof(Str31);
- myAttrDesc[0].bufferDescriptor.actCount = 0;
- /* null terminate array of attribute descriptors */
- myAttrDesc[1].attributeSignature = NULL;
-
- err = OAMSetAttribute(sess, userObj, myAttrDesc, NULL);
- }
- void MyNotifyProc( OAMNotification *no )
- {
- printf("vers %d sess %X objectID %d notifyID %d userData %X type %X \n",
- no->version, no->sess, no->objectID, no->notifyID, no->userData, no->u.oamType);
- }
- void MySetNotifyProc(OAMSessionID sessionID)
- {
- OAMStatus err = noErr;
- OAMNotifyOption notifyNewObj = { kOAMNotifyNewObject, 0 };
- OAMBooleanOption setSelf = { true };
- OAMNotificationSpec spec[3];
-
- err = OAMSetNotificationProc(sessionID, gNotifyProc, NULL);
-
- /* set up NotifySpec */
- memset(&spec, 0, sizeof(spec));
- /* NOTIFY NEW OBJECT */
- spec[0].oamType = kOAMNotifyStartOption;
- spec[0].bufferDescriptor.buffer = ¬ifyNewObj;
- spec[0].bufferDescriptor.bufferLen = sizeof(OAMNotifyOption);
-
- /* NOTIFICATION (SETSELFSEND == TRUE BY DEFAULT) */
- spec[1].oamType = kOAMNotifySelfOption;
- spec[1].bufferDescriptor.buffer = &setSelf;
- spec[1].bufferDescriptor.bufferLen = sizeof(OAMBooleanOption);
- /* terminator */
- spec[2].oamType = 0;
-
- err = OAMRequestNotification(sessionID, spec, NULL);
-
- }
-
- int main ( void )
- {
- OAMStatus err = noErr;
- OAMSessionID sessionID = 0;
- Str31 machineName = {};
- Str31 userName = "\puser";
- Str31 newName = "\pnewName";
- OAMObjectSpec userObj;
-
- /* initialize Registry library for 4 maximum sessions*/
- err = OAMInitialize(4, 0, NULL, NULL);
- printf("OAMInitialize err: %d\n", err);
-
- gNotifyProc = NewOAMNotificationProc(MyNotifyProc);
-
- MyListRegistryAgents("\p≈", "\p*");
- sessionID = MyOpenLocalAgentSession();
- if (sessionID)
- {
- MySetNotifyProc(sessionID);
- /*
- err = MyGetMachineName(sessionID, machineName);
- printf("MachineName(%#s)\n", machineName);
-
- MyListAllUserNames(sessionID);
- */
- ConcatUniqueNumString(userName);
- MyCreateUser(sessionID, userName);
- MyAuthenticateUser(sessionID, userName);
-
- ConcatUniqueNumString(newName);
- BuildObjectSpecByNameType(&userObj, userName, kOAMUser);
- MyChangeUserName(sessionID, &userObj, newName);
-
- err = OAMDeleteObject(sessionID, &userObj, NULL);
-
- OAMCloseSession(sessionID, NULL);
- }
- err = OAMDeInitialize();
-
- return 0;
- }